package com.fanxing.utils;

import com.fanxing.ui.StartJFrame;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellReference;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 合并文件
 */
public class MergeFile {

    // 文件储存位置 默认为桌面
    private static final String FILE_PATH = System.getProperty("user.home") + "/Desktop";

    // 缓存样式
    private static final Map<Integer, HSSFCellStyle> styleCache = new HashMap<>();
    private static final Logger log = LogManager.getLogger(MergeFile.class);


    // 合并文件
    public void mergeTempFile() throws IOException {
        // 读取模板文件
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("template/邮件查询月度模板.xls");
        HSSFWorkbook excel = new HSSFWorkbook(is);
        // 获取第一个sheet
        HSSFSheet sheet = excel.getSheetAt(0);
        // 获取第二行的单元格样式
        getCellStyle(sheet.getRow(1));
        // 获取临时文件列表
        File[] tempFiles = TempFileManager.getAllTempFiles();
        // 如果没有文件则结束方法
        if (tempFiles == null) {
            StartJFrame.showJDialog("暂无文件");
            return;
        }

        // 获取文件总数
        int fileLength = tempFiles.length;
        // 定义变量计算已完成的文件数
        int completedFileNum = 0;
        // 从第二行开始写入数据 不包含合计
        int rowNum = 1;
        for (File tempFile : tempFiles) {
            completedFileNum++;
            try {
                // 读取临时文件
                System.out.println(tempFile.getAbsolutePath());
                InputStream tempIs = new FileInputStream(tempFile);
                HSSFWorkbook tempExcel = new HSSFWorkbook(tempIs);
                HSSFSheet tempSheet = tempExcel.getSheetAt(0);

                // 读取每一个文件的数据写到新文件中
                int tempRowsNumber = tempSheet.getPhysicalNumberOfRows() ;
                // 如果不是最后一份文件,则不读取最后一行
                if (completedFileNum != fileLength){
                    tempRowsNumber--;
                }
                for (int i = 1; i < tempRowsNumber; i++) {
                    System.out.println("读取第" + i + "行数据");
                    // 读取每一个数据写到新文件中
                    if (rowNum != 1) {
                        // 创建新行
                        sheet.createRow(rowNum);
                    }
                    HSSFRow newRow = sheet.getRow(rowNum);
                    HSSFRow tempRow = tempSheet.getRow(i);
                    // 读取每一行的数据
                    for (int j = 0; j < tempRow.getPhysicalNumberOfCells(); j++) {
                        // 获取单元格
                        HSSFCell tempCell = tempRow.getCell(j);
                        if (tempCell != null) {
                            // 创建目标单元格（如果不存在）
                            HSSFCell newCell = newRow.createCell(j);
                            // 设置单元格类型
                            newCell.setCellType(tempCell.getCellType());
                            // 设置单元格样式
                            newCell.setCellStyle(styleCache.get(j));
                            // 设置单元格值
                            switch (tempCell.getCellType()) {
                                case STRING:
                                    // 设置字符串值
                                    newCell.setCellValue(tempCell.getStringCellValue());
                                    break;
                                case NUMERIC:
                                    // 设置数值
                                    newCell.setCellValue(tempCell.getNumericCellValue());
                                    break;
                                case BOOLEAN:
                                    // 设置布尔值
                                    newCell.setCellValue(tempCell.getBooleanCellValue());
                                    break;
                                case FORMULA:
                                    // 设置公式
                                    newCell.setCellFormula(tempCell.getCellFormula());
                                    break;
                                default:
                                    // 其他类型
                                    newCell.setCellValue("");
                                    break;
                            }
                        }
                        // 如果 j = 0 则单独设置内容
                        if (j == 0) {
                            // 设置合并单元格
                            newRow.getCell(0).setCellValue(rowNum);
                        }
                    }
                    rowNum++;
                }
                tempIs.close();
            } catch (Exception e) {
                StartJFrame.showJDialog("文件合并失败");
                e.printStackTrace();
            }
        }
        // 修改最后一行的数据
        HSSFRow totalRow = sheet.getRow(--rowNum);
        for (int i = 0; i < totalRow.getPhysicalNumberOfCells(); i++) {
            if (i == 0){
                totalRow.getCell(i).setCellValue("");
            }
            if (i >= 16 && i <= 23){
                // 假设需要对数字列求和
                totalRow.getCell(i).setCellFormula("SUM(" + CellReference.convertNumToColString(i) + "2:" + CellReference.convertNumToColString(i) + (rowNum) + ")");
            }
        }

        // 保存文件
        excel.write(new File(FILE_PATH + "/合并文件.xls"));
        StartJFrame.showJDialog("文件合并成功,已保存到桌面");
        // 关闭文件流
        excel.close();
        // 删除临时文件
        TempFileManager.clearTempFiles();
    }

    // 获取某一行的单元格格式,存储到styleCache 中
    private static void getCellStyle(HSSFRow row) {
        for (int index = 0; index < row.getPhysicalNumberOfCells(); index++) {
            HSSFCell cell = row.getCell(index);
            if (cell != null) {
                HSSFCellStyle cellStyle = cell.getCellStyle();
                styleCache.put(index, cellStyle);
            }
        }

    }
}
